#!/usr/bin/env node

import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'

const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

// 配置
const API_DIR = path.join(__dirname, '../src/api')
const OUTPUT_FILE = path.join(API_DIR, 'type.ts')

/**
 * 递归查找所有 types 目录下的 index.ts 文件
 * @param dir 要搜索的目录
 * @param relativePath 相对于 API 目录的路径
 * @returns 找到的 types 文件路径数组
 */
function findTypesFiles(dir: string, relativePath: string = ''): string[] {
  const typesFiles: string[] = []
  
  try {
    const items = fs.readdirSync(dir, { withFileTypes: true })
    
    for (const item of items) {
      const fullPath = path.join(dir, item.name)
      const currentRelativePath = path.join(relativePath, item.name)
      
      if (item.isDirectory()) {
        // 如果是 types 目录且包含 index.ts 文件
        if (item.name === 'types') {
          const indexPath = path.join(fullPath, 'index.ts')
          if (fs.existsSync(indexPath)) {
            // 生成相对于 API 目录的导入路径
            const importPath = `./${currentRelativePath}`.replace(/\\/g, '/')
            typesFiles.push(importPath)
          }
        } else {
          // 递归搜索子目录
          typesFiles.push(...findTypesFiles(fullPath, currentRelativePath))
        }
      }
    }
  } catch (error) {
    console.error(`Error reading directory ${dir}:`, (error as Error).message)
  }
  
  return typesFiles
}

/**
 * 生成类型导出文件
 */
function generateTypeExports(): void {
  console.log('🔍 正在扫描 API 目录中的 types 文件...')
  
  const typesFiles = findTypesFiles(API_DIR)
  
  if (typesFiles.length === 0) {
    console.log('❌ 没有找到任何 types 文件')
    return
  }
  
  console.log(`✅ 找到 ${typesFiles.length} 个 types 文件:`)
  typesFiles.forEach(file => console.log(`   - ${file}`))
  
  // 生成导出内容
  const exports = typesFiles
    .map(file => `export * from '${file}'`)
    .join('\n')
  
  const content = `// 此文件由 scripts/generate-types.ts 自动生成
// 请不要手动修改此文件
// 运行 npm run gen:types 来重新生成

${exports}
`
  
  // 写入文件
  try {
    fs.writeFileSync(OUTPUT_FILE, content, 'utf8')
    console.log(`✅ 成功生成 ${OUTPUT_FILE}`)
  } catch (error) {
    console.error('❌ 写入文件失败:', (error as Error).message)
    process.exit(1)
  }
}

/**
 * 防抖函数
 */
function debounce<T extends (...args: any[]) => void>(
  func: T,
  wait: number
): (...args: Parameters<T>) => void {
  let timeout: NodeJS.Timeout | null = null
  
  return (...args: Parameters<T>): void => {
    if (timeout) {
      clearTimeout(timeout)
    }
    timeout = setTimeout(() => func(...args), wait)
  }
}

// 监听文件变化（可选）
if (process.argv.includes('--watch')) {
  console.log('👀 监听文件变化模式...')
  
  const debouncedGenerate = debounce(generateTypeExports, 100)
  
  fs.watch(API_DIR, { recursive: true }, (eventType, filename) => {
    if (filename && filename.includes('types') && filename.endsWith('.ts')) {
      console.log(`📁 检测到文件变化: ${filename}`)
      debouncedGenerate()
    }
  })
}

// 执行生成
generateTypeExports()
